package com.ideaaedi.zoo.diy.artifact.generator.properties.nested;

import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.google.common.collect.Lists;
import com.ideaaedi.zoo.diy.artifact.generator.properties.GeneratorDatabaseProperties;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.beans.BeanUtils;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

/**
 * 数据库文档生成器配置
 */
@Data
@EqualsAndHashCode(callSuper = true)
public class DatabaseDoc extends GeneratorDatabaseProperties implements Cloneable {
    
    /**
     * 组织
     */
    private String organization;
    
    /**
     * url
     */
    private String organizationUrl;
    
    /**
     * 标题
     */
    private String title;
    
    /**
     * 版本号
     */
    @NotBlank
    private String version = "1.0.0";
    
    /**
     * 描述
     */
    @NotBlank
    private String description = "数据库设计文档";
    
    /**
     * 生成配置
     */
    @NotNull
    @NestedConfigurationProperty
    private ProcessConfig produceConfig = ProcessConfig.builder()
            // 指定生成逻辑、当存在指定表、指定表前缀、指定表后缀时，将生成指定表，其余表不生成、并跳过忽略表配置
            // 根据名称指定表生成
            .designatedTableName(Lists.newArrayList())
            // 根据表前缀生成
            .designatedTablePrefix(Lists.newArrayList())
            // 根据表后缀生成
            .designatedTableSuffix(Lists.newArrayList())
            // 忽略指定名称的表
            .ignoreTableName(Lists.newArrayList())
            // 忽略指定名称前缀的表
            .ignoreTablePrefix(Lists.newArrayList())
            // 忽略指定名称后缀的表
            .ignoreTableSuffix(Lists.newArrayList())
            .build();
    
    /**
     * 引擎配置，关于数据库文档生成相关配置
     */
    @NotNull
    @NestedConfigurationProperty
    private EngineConfig engineConfig = EngineConfig.builder()
            // 生成文件存放的目录
            .fileOutputDir("./generator/database_doc")
            // 生成完成是否打开输出目录
            .openOutputDir(false)
            // 生成文件类型：HTML-> .html，WORD-> .doc、MD-> .md
            .fileType(EngineFileType.HTML)
            // 生成模板实现
            .produceType(EngineTemplateType.freemarker)
            // 自定义文件名称
            .fileName("库表说明")
            .build();
    
    @Override
    @SuppressWarnings("MethodDoesntCallSuperMethod")
    public DatabaseDoc clone() {
        EngineConfig cloneEngineConfig = EngineConfig.builder().build();
        BeanUtils.copyProperties(this.engineConfig, cloneEngineConfig);
        
        ProcessConfig cloneProcessConfig = ProcessConfig.builder().build();
        BeanUtils.copyProperties(this.produceConfig, cloneProcessConfig);
        
        DatabaseDoc clone = new DatabaseDoc();
        BeanUtils.copyProperties(this, clone, "engineConfig", "produceConfig");
        clone.setEngineConfig(cloneEngineConfig);
        clone.setProduceConfig(cloneProcessConfig);
        return clone;
    }
}
